 .text
  .align  2
  .global RV_sgemm_v2
RV_sgemm_v2:
  vsetvli t0, zero, e32, m2, ta, ma
  li s11, 3
  #li s10, 1
  mv a6, a1
  mv a7, a2  
  fcvt.s.w ft11, x0

LOOP_An_Bn:
  mv s8, a5

LOOP_A_Bn:
  addi s8, s8, -4
  mv s9, a0        
  addi s9, s9, -4  
  vxor.vv v16, v16, v16
  vxor.vv v18, v18, v18
  vxor.vv v20, v20, v20
  vxor.vv v22, v22, v22
  vxor.vv v24, v24, v24
  vxor.vv v26, v26, v26
  vxor.vv v28, v28, v28
  vxor.vv v30, v30, v30

  addi t0, a1, 32
  addi t1, a1, 64
  addi t2, a1, 96

  vle32.v v0, (a1)
  vle32.v v2, (t0)
  vle32.v v4, (t1)
  vle32.v v6, (t2)
  flw ft0, 0(a2)
  flw ft1, 4(a2)
  flw ft2, 8(a2)
  flw ft3, 12(a2)
  flw ft4, 16(a2)
  flw ft5, 20(a2)
  flw ft6, 24(a2)
  flw ft7, 28(a2)
   
  addi t3, a1, 128
  addi t4, a1, 160
  addi t5, a1, 192
  addi t6, a1, 224

  addi a2, a2, 32
  addi a1, a1, 256
LOOP4:
  vfmacc.vf v16, ft0, v0
  vfmacc.vf v18, ft0, v2
  vle32.v v8, (t3)
  
  vfmacc.vf v20, ft1, v0
  vfmacc.vf v22, ft1, v2
  flw fa2, 0(a2)
  flw fa3, 4(a2)

  vfmacc.vf v24, ft2, v0
  vfmacc.vf v26, ft2, v2
  vle32.v v10, (t4)

  vfmacc.vf v28, ft3, v0
  vfmacc.vf v30, ft3, v2
  flw fa4, 8(a2)
  flw fa5, 12(a2)

  addi t0, a1, 32
  addi t1, a1, 64
  #addi t2, a1, 96
 
  vfmacc.vf v16, ft4, v4
  vfmacc.vf v18, ft4, v6
  vle32.v v12, (t5)

  vfmacc.vf v20, ft5, v4
  vfmacc.vf v22, ft5, v6
  flw fa6, 16(a2)
  flw fa7, 20(a2)

  vfmacc.vf v24, ft6, v4
  vfmacc.vf v26, ft6, v6
  flw ft8, 24(a2)
  flw ft9, 28(a2)
  
  addi a2, a2, 32
  addi t2, a1, 96  
  addi s9, s9, -4  

  vfmacc.vf v28, ft7, v4
  vfmacc.vf v30, ft7, v6
  vle32.v v14, (t6)
  
  vfmacc.vf v16, fa2, v8
  vfmacc.vf v18, fa2, v10
  vle32.v v0, (a1)

  vfmacc.vf v20, fa3, v8
  vfmacc.vf v22, fa3, v10
  flw ft0, 0(a2)
  flw ft1, 4(a2)

  vfmacc.vf v24, fa4, v8
  vfmacc.vf v26, fa4, v10
  vle32.v v2, (t0)
  
  vfmacc.vf v28, fa5, v8
  vfmacc.vf v30, fa5, v10
  flw ft2, 8(a2)
  flw ft3, 12(a2)

  addi t3, a1, 128
  addi t4, a1, 160
  addi t5, a1, 192
  addi t6, a1, 224
  addi a1, a1, 256
  
  vfmacc.vf v16, fa6, v12
  vfmacc.vf v18, fa6, v14
  vle32.v v4, (t1)
  
  vfmacc.vf v20, fa7, v12
  vfmacc.vf v22, fa7, v14
  flw ft4, 16(a2)
  flw ft5, 20(a2)

  vfmacc.vf v24, ft8, v12
  vfmacc.vf v26, ft8, v14
  vle32.v v6, (t2)
  
  vfmacc.vf v28, ft9, v12
  vfmacc.vf v30, ft9, v14
  flw ft6, 24(a2)
  flw ft7, 28(a2)
  addi a2, a2, 32

  ble s9, s11, LOOP2
  #if s9 > 3, jump LOOP4
  j LOOP4

LOOP2:
  vfmacc.vf v16, ft0, v0
  vfmacc.vf v18, ft0, v2
  vle32.v v8, (t3)
  
  vfmacc.vf v20, ft1, v0
  vfmacc.vf v22, ft1, v2
  flw fa2, 0(a2)
  flw fa3, 4(a2)

  vfmacc.vf v24, ft2, v0
  vfmacc.vf v26, ft2, v2
  vle32.v v10, (t4)
  
  vfmacc.vf v28, ft3, v0
  vfmacc.vf v30, ft3, v2
  flw fa4, 8(a2)
  flw fa5, 12(a2)  
  
  vfmacc.vf v16, ft4, v4
  vfmacc.vf v18, ft4, v6
  vle32.v v12, (t5)

  vfmacc.vf v20, ft5, v4
  vfmacc.vf v22, ft5, v6
  flw fa6, 16(a2)
  flw fa7, 20(a2)

  vfmacc.vf v24, ft6, v4
  vfmacc.vf v26, ft6, v6
  vle32.v v14, (t6)
  
  vfmacc.vf v28, ft7, v4
  vfmacc.vf v30, ft7, v6
  flw ft8, 24(a2)
  flw ft9, 28(a2)
  
  vfmacc.vf v16, fa2, v8
  vfmacc.vf v18, fa2, v10
  vfmacc.vf v20, fa3, v8
  vfmacc.vf v22, fa3, v10
  vfmacc.vf v24, fa4, v8
  vfmacc.vf v26, fa4, v10
  vfmacc.vf v28, fa5, v8
  vfmacc.vf v30, fa5, v10
  vfmacc.vf v16, fa6, v12
  vfmacc.vf v18, fa6, v14
  vfmacc.vf v20, fa7, v12
  vfmacc.vf v22, fa7, v14
  vfmacc.vf v24, ft8, v12
  vfmacc.vf v26, ft8, v14
  vfmacc.vf v28, ft9, v12
  vfmacc.vf v30, ft9, v14
  
  addi a2, a2, 32 
 
MULTIPLY_alpha:
  vsetvli t0, zero, e32, m8
  vfmul.vf v16, v16, fa0
  vfmul.vf v24, v24, fa0
  
beta_NOTZERO:
  addi t1, a3, 128
  vle32.v v0, (a3)
  vle32.v v8, (t1)
  vfmacc.vf v16, fa1, v0
  vfmacc.vf v24, fa1, v8

  vse32.v v16, (a3)
  vse32.v v24, (t1) 
  addi a3, a3, 256   

END_one:
  vsetvli t0, zero, e32, m2
  mv s10, a1
  mv a1, a6
  bgtz s8, LOOP_A_Bn
  addi a4, a4, -16
  mv a1, s10
  mv a6, s10
  mv a2, a7
  bgtz a4, LOOP_An_Bn
  
ret
